/**Redis不支持直接将Java对象存储到数据库中，所以需要将java对象进行序列化得到字节数组，
 * 然后将字节数组存入到redis中，需要数据的时候就从redis数据库中取出字节数组，
 * 再经过反序列化将自己数组转换成对象使用（jdk序列化性能比谷歌公司的Protobuf序列化性能要差一些，
 * 而且序列化后的字节长度要也会长一些，所以推荐使用Protobuf，Protobuf如何进行序列化请看我的另一篇帖子）*/
package com.lpc.redis.serialize;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/**
 * 
 * @ClassName:ObjectTranscoder
 * @Description: redis序列化对象
 * @author: lpc
 * @date:2016年12月23日下午5:12:07
 */
public class ObjectTranscoder {
	public static byte[] serialize(Object value) {
		if (value == null) {
			throw new NullPointerException("Can‘t serialize null");
		}
		byte[] rv = null;
		ByteArrayOutputStream bos = null;
		ObjectOutputStream os = null;
		try {
			bos = new ByteArrayOutputStream();
			os = new ObjectOutputStream(bos);
			os.writeObject(value);
			os.close();
			bos.close();
			rv = bos.toByteArray();
		} catch (IOException e) {
			throw new IllegalArgumentException("Non-serializable object", e);
		} finally {
			try {
				if (os != null)
					os.close();
				if (bos != null)
					bos.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
		return rv;
	}

	public static Object deserialize(byte[] in) {
		Object rv = null;
		ByteArrayInputStream bis = null;
		ObjectInputStream is = null;
		try {
			if (in != null) {
				bis = new ByteArrayInputStream(in);
				is = new ObjectInputStream(bis);
				rv = is.readObject();
				is.close();
				bis.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (is != null)
					is.close();
				if (bis != null)
					bis.close();
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
		return rv;
	}

}
